package com.zenithsun.common.security.session;

import java.util.*;
import java.util.Map.Entry;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.zenithsun.common.security.csrf.TokenTagForUrl;

/**
 * 检查session是否已存在,针对用户登录
 * 
 * @author Jiang
 *
 */
public class SessionUtil {
	
	private static final String MAP_KEY = "SEESION_MAP";
	private static Logger log = LoggerFactory.getLogger(SessionUtil.class);
	/**
	 * 检查session是否已经存在
	 * @param session
	 * @param valueKey
	 */
	public static synchronized void checkSession(HttpSession session, String valueKey) {
		if (session != null) {
			Map<String, HttpSession> sessionMap = getSessionMap(session);
			if (valueKey != null && sessionMap!=null) {
				if (sessionMap != null) {// 如果是全应用第一次使用就new一个
					Iterator<Entry<String, HttpSession>> iter = sessionMap.entrySet().iterator();// 拿出sessionMap中所有的key进行迭代遍历
					while (iter.hasNext()) {
						@SuppressWarnings("rawtypes")
						Entry entry = (Entry) iter.next();
						String key = (String) entry.getKey();
						if (key.equals(valueKey)) {// 判断sessionMap是否有此主键的用户
							HttpSession userSeeeion = sessionMap.get(key);// 如果有就获得它的value(就是那个放了用户的session)
							userSeeeion.invalidate();// 直接干掉session
							log.info("http session:一个用户已被无情地挤掉。。。。");
						}
					}
				}
				sessionMap.put(valueKey, session);// 继续把主键和session装到sessionMap里
				session.getServletContext().setAttribute(MAP_KEY, sessionMap);// 把sessionMap扔到application中，以便下次使用
			} else {
				log.info("http session:无可用 valueKey");
			}
		} else {
			log.info("http session:无可用session");
		}
	}
	/**
	 * 获取Context中的session map
	 * @param session
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static synchronized Map<String, HttpSession> getSessionMap(HttpSession session){
		Map<String, HttpSession> sessionMap = (Map<String, HttpSession>) session.getServletContext()
				.getAttribute(MAP_KEY);// 从application中取得sessionMap
		if (sessionMap == null) {// 如果是全应用第一次使用就new一个
			sessionMap = new HashMap<String, HttpSession>();
		}
		return sessionMap;
	}
	
	/**
	 * 移除记录的session
	 * @param session
	 * @param valueKey
	 */
	public static synchronized void removeSession(HttpSession session,String valueKey){
		Map<String, HttpSession> sessionMap = getSessionMap(session);
		if(sessionMap != null){
			sessionMap.remove(valueKey);
		}
	}
}
